home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d949.lha / BBBBS / BBBBS65.lha / rexx / bbsREPORT.rexx < prev    next >
OS/2 REXX Batch file  |  1993-09-21  |  10KB  |  394 lines

  1. /*         $VER: bbsREPORT.rexx 6.4 (21.9.93)
  2.  
  3.                - reports user inactivity -
  4.        - any user who hasn't called for 365 days -
  5.    - less than 3 calls with last older than 270 days -
  6.        - only 1 call made more than 180 days ago -
  7.      - CHANGE THESE LIMITS IF YOU DON'T LIKE THEM! -
  8.  
  9.           - also will report filelist problems -
  10.  
  11. copyright 1991-93 Richard Lee Stockton FREELY DISTRIBUTABLE
  12.  
  13. */
  14.  
  15. CALL TIME('R')
  16. HOW_MANY=100    /* how many old files to put on report */
  17. MIN_DAYS=30     /* don't report files younger than this (in days) */
  18.  
  19. least.=999999999999
  20. CALL PRAGMA('P',-2)
  21.  
  22. SIGNAL ON ERROR
  23. SIGNAL ON SYNTAX
  24. SIGNAL ON FAILURE
  25. NUMERIC DIGITS 14
  26.  
  27. ARG name what2do 
  28. temp=STRIP(WORD(what2do,WORDS(what2do)))
  29. IF DATATYPE(temp,'N') THEN SMALLEST=temp
  30. ELSE SMALLEST=0
  31.  
  32. figarg='s:CONFIG.BBS'
  33. IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
  34. x=OPEN(f,figarg,'R')
  35. IF x=0 THEN
  36.   DO
  37.     SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'
  38.     EXIT(20)
  39.   END
  40.  
  41. lynes.=''
  42. DO i=1 TO 8
  43.   lynes.i=READLN(f)
  44. END
  45. CALL CLOSE(f)
  46.  
  47. compos=POS('/*',lynes.1)
  48. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  49.  
  50. bbsname = STRIP(lynes.1)
  51. sysop   = UPPER(WORD(lynes.2,1))
  52. bbspath = WORD(lynes.6,1)
  53. IF ~EXISTS(bbspath) THEN
  54.   DO
  55.     SAY bbspath 'does not exist!'
  56.     EXIT(20)
  57.   END
  58. testchar=RIGHT(bbspath,1)
  59. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  60.  
  61. libpath            = WORD(lynes.8,1)
  62. IF ~EXISTS(libpath) THEN
  63.   DO
  64.     MSG libpath 'does not exist!'
  65.     EXIT(20)
  66.   END
  67. testchar=RIGHT(libpath,1)
  68. IF testchar~='/' & testchar~=':' THEN libpath=libpath'/'
  69.  
  70.  
  71. IF FIND(what2do,'USERS')=0 THEN SIGNAL FILEREPORT
  72.  
  73. inarg=bbspath'EMail/'name'/INACTIVE_USERS'
  74. CALL CLOSE(STDOUT)
  75. CALL OPEN(STDOUT,inarg,'W')
  76. IF x=0 THEN
  77.   DO
  78.     SAY inarg 'would not open for writing!'
  79.     EXIT(20)
  80.   END
  81.  
  82. userlist=SHOWDIR(bbspath'Users','F')
  83. x=FIND(userlist,sysop)
  84. IF x>0 THEN userlist=DELWORD(userlist,x,1)
  85. SAY LEFT('USER_NAME',28)'days last_session calls location'
  86. ndate=DATE('I')
  87. ten=0
  88. thirty=0
  89. ninty=0
  90. sixmo=0
  91. DO i=1 TO WORDS(userlist)
  92.   thisuser=WORD(userlist,i)
  93.   x=OPEN(f,bbspath'Users/'thisuser,'R')
  94.   IF x=0 THEN
  95.     DO
  96.       SAY thisuser 'userfile would not open!'
  97.       ITERATE i
  98.     END
  99.   lynes.=''
  100.   DO j=1 TO 23
  101.     line=READLN(f)
  102.     IF EOF(f) THEN LEAVE j
  103.     lynes.j=line
  104.   END
  105.   CALL CLOSE(f)
  106.   idate=0
  107.   add2list=0
  108.   IF DATATYPE(WORD(lynes.13,1),'N') THEN
  109.     DO
  110.       idate=DATE('I',STRIP(WORD(lynes.13,1)),'S')
  111.       age=ndate-idate
  112.       IF age<11 THEN ten=ten+1
  113.       IF age<31 THEN thirty=thirty+1
  114.       IF age<91 THEN ninty=ninty+1
  115.       IF age<183 THEN sixmo=sixmo+1
  116.       IF FIND(lynes.21,'VIP_USER')>0 THEN NOP
  117.       ELSE IF (idate+365)<ndate THEN add2list=365
  118.       ELSE IF WORD(lynes.19,6)<4 & (idate+270)<ndate THEN add2list=270
  119.       ELSE IF WORD(lynes.19,6)<2 & (idate+180)<ndate THEN add2list=180
  120.       IF add2list>0 THEN
  121.         DO
  122.           line=LEFT(thisuser,28) RIGHT(add2list,3)'  'DATE(,WORD(lynes.13,1),'S')
  123.           line=line'  'WORD(lynes.19,6)'  'lynes.3
  124.           SAY line
  125.         END
  126.     END
  127.   ELSE SAY 'Bad Date!' thisuser lynes.13
  128. END
  129. SAY
  130. SAY RIGHT(WORDS(userlist),5) 'users.'
  131. SAY RIGHT(sixmo,5) 'of these users have called within the last 6 months.'
  132. SAY RIGHT(ninty,5) 'of these users have called within the last 90 days.'
  133. SAY RIGHT(thirty,5) 'of these users have called within the last 30 days.'
  134. SAY RIGHT(ten,5) 'of these users have called within the last 10 days.'
  135. SAY
  136. t=(.5+TIME('E'))%1
  137. min=t%60
  138. hrs=min%60
  139. min=min//60
  140. secs=t//60
  141. temp=' - It took'
  142. IF hrs>1 THEN temp=temp hrs 'hours'
  143. ELSE IF hrs=1 THEN temp=temp '1 hour'
  144. IF min>1 THEN temp=temp min 'minutes'
  145. ELSE IF min=1 THEN temp=temp '1 minute'
  146. IF secs=1 THEN temp=temp '1 second'
  147. ELSE IF secs>0 THEN temp=temp secs 'seconds'
  148. temp=temp 'to compile this report -'
  149. SAY temp
  150. SAY
  151. IF GETCLIP('BBS_level')~='' & WORD(GETCLIP('BBS_lastcaller'),1)=name THEN
  152.   CALL SETCLIP('BBS_MESSAGE','INACTIVE_USERS report is waiting in Email.')
  153. CALL TIME('R')
  154.  
  155.  
  156.  
  157. FILEREPORT:
  158. IF FIND(what2do,'FILES')=0 THEN EXIT(0)
  159.  
  160. inarg=bbspath'EMail/'name'/FILELISTS_REPORT'
  161. CALL CLOSE(STDOUT)
  162. CALL OPEN(STDOUT,inarg,'W')
  163. IF x=0 THEN
  164.   DO
  165.     SAY inarg 'would not open for writing!'
  166.     EXIT(20)
  167.   END
  168.  
  169. SAY ' - FileReport -' DATE('W')'  'DATE()'  'TIME('C')
  170. SAY LEFT('-',75,'-')
  171.  
  172. dirs.='0000000'
  173. IF readopen(bbspath'Lists/Libraries') THEN
  174.   DO
  175.     DO i=1
  176.       line=READLN(f)
  177.       IF line='END' | EOF(f) THEN LEAVE i
  178.       num=WORD(line,1)
  179.       IF DATATYPE(num,'N') THEN dirs.num=STRIP(WORD(line,2))
  180.     END
  181.     CALL CLOSE(f)
  182.   END
  183.  
  184. problem=0
  185. IF readopen(bbspath'Lists/Files') THEN
  186.   DO
  187.     DO i=1
  188.       line=READLN(f)
  189.       IF EOF(f) THEN BREAK
  190.       listfile=libpath||COMPRESS(WORD(line,2)'/'WORD(line,3),' ')
  191.       IF EXISTS(listfile) THEN ITERATE i
  192.       link=STATEF(bbspath'FileNotes/'COMPRESS(WORD(line,2)'/'WORD(line,3)))
  193.       link=WORD(link,8)
  194.       realfile=listfile
  195.       IF link~='' THEN realfile=link
  196.       IF EXISTS(realfile) THEN ITERATE i
  197.       temp=listfile
  198.       IF temp~=realfile THEN temp=temp '('realfile')'
  199.       SAY temp 'does not exist!'
  200.       problem=1
  201.     END
  202.     CALL CLOSE(f)
  203.   END
  204. IF ~problem THEN SAY 'All files in the master list exist as links or in the libraries.'
  205. ELSE SAY 'The above files in the master list are not available for downloading!'
  206. SAY i-1 'files listed in ''Lists/Files''.'
  207. xlist='.JPG .GIF .LHA .LZH .ARC .ZOO .ZIP .RUN .EXE .PAK .LHW'
  208. xlist=xlist '.ARJ .WRP .ZOM .DMS .CPT .SEA .SIT .TXT .MPG .JPE JPEG'
  209. k=0
  210. kk=0
  211. DO i=1 TO 99
  212.   IF dirs.i='' | dirs.i='0000000' THEN ITERATE i
  213.   realfiles=SHOWDIR(libpath||dirs.i)
  214.   k=k+WORDS(realfiles)
  215.   DO j=1 TO WORDS(realfiles)
  216.     DO
  217.       file=dirs.i'/'STRIP(WORD(realfiles,j))
  218.       IF ~EXISTS(bbspath'FileNotes/'file) THEN
  219.         SAY 'No file description for' file WORD(STATEF(libpath||file),2) 'bytes.'
  220.     END
  221.   END
  222.   notes=SHOWDIR(bbspath'FileNotes/'dirs.i)
  223.   DO j=1 TO WORDS(notes)
  224.     thisnote=bbspath'FileNotes/'dirs.i'/'STRIP(WORD(notes,j))
  225.     x=OPEN(f,thisnote,'R')
  226.     IF x=0 THEN ITERATE j
  227.     line1=READLN(f)
  228.     line2=READLN(f)
  229.     line3=READLN(f)
  230.     CALL CLOSE(f)
  231.     kk=kk+1
  232.     IF ~EXISTS(libpath||dirs.i'/'STRIP(WORD(notes,j))) THEN
  233.       DO
  234.         link=WORD(STATEF(thisnote),8)
  235.         IF link='' THEN ITERATE j
  236.         ELSE
  237.           DO
  238.             IF EXISTS(link) THEN k=k+1
  239.             ELSE ITERATE j
  240.           END
  241.       END
  242.     filenum=WORD(line1,2)
  243.     IF FIND(xlist,UPPER(RIGHT(thisnote,4)))=0 THEN
  244.       SAY 'File #' filenum WORD(notes,j) 'in' dirs.i 'may be unarchived.'
  245.     nname=WORD(line2,2)
  246.     size=WORD(line2,4)
  247.     dlds=WORD(line2,7)
  248.     dirs.i.1=dirs.i.1+1      /*  files this dir */
  249.     dirs.i.2=dirs.i.2+size   /*  bytes this dir */
  250.     dirs.i.3=dirs.i.3+dlds   /* dloads this dir */
  251.     IF size<SMALLEST THEN ITERATE j
  252.     uldate=norm2seq(SUBWORD(line3,4,3))
  253.     IF uldate<19780000 | uldate>99991231 THEN
  254.       DO
  255.         SAY 'Bad Date! 'SUBWORD(line3,4,3) thisnote
  256.         ITERATE j
  257.       END
  258.     IF DATE('I',uldate,'S')>(DATE('I')-MIN_DAYS) THEN ITERATE j
  259.     DO jj=HOW_MANY TO 1 BY -1
  260.       IF dlds>least.jj THEN ITERATE j
  261.       IF dlds=least.jj & uldate>least.jj.0 THEN ITERATE j
  262.       jjj=jj+1
  263.       least.jjj=least.jj
  264.       least.jjj.0=least.jj.0
  265.       least.jjj.1=least.jj.1
  266.       least.jj=dlds
  267.       least.jj.0=uldate
  268.       least.jj.1=RIGHT(size,8) RIGHT(filenum,6) LEFT(dirs.i,16) nname
  269.     END
  270.   END
  271. END
  272.  
  273. SAY kk 'filenotes.'
  274. SAY k 'actual files in libraries.'
  275.  
  276. IF readopen(bbspath'Lists/Files.ALPHA') THEN
  277.   DO
  278.     DO i=1
  279.       line=READLN(f)
  280.       IF EOF(f) THEN BREAK
  281.     END
  282.     CALL CLOSE(f)
  283.   END
  284. SAY i-1 'files listed in ''Lists/Files.ALPHA''.'
  285. SAY
  286. SAY ' - The 'HOW_MANY' least downloaded, oldest files greater -'
  287. SAY ' - than' comma(SMALLEST) 'bytes in the current libraries -'
  288. SAY RIGHT('dls',5) LEFT('Date',11) RIGHT('Bytes',8) 'File #' LEFT('Library',16) 'Filename'
  289. SAY LEFT('-',62,'-')
  290. DO i=1 TO HOW_MANY
  291.   IF least.i>99991231 THEN ITERATE i
  292.   SAY RIGHT(least.i,5) DATE(,least.i.0,'S') least.i.1
  293. END
  294. SAY
  295. SAY ' - LIBRARY STATISTICS -'
  296. SAY RIGHT('Lib#',4) LEFT('Library Name',16) RIGHT('Files',5) RIGHT('Bytes',14) RIGHT('Downloads',9) RIGHT('AverageSize',11) RIGHT('DL/file',7)
  297. SAY LEFT('-',72,'-')
  298. tots.=0
  299. DO i=1 TO 99
  300.   IF dirs.i='' | dirs.i=0 THEN ITERATE i
  301.   DO j=1 TO 3
  302.     tots.j=tots.j+dirs.i.j
  303.   END
  304.   temp=dirs.i.1
  305.   IF temp<1 THEN temp=1
  306.   SAY RIGHT(i,4) LEFT(dirs.i,16) RIGHT(comma(dirs.i.1),5) RIGHT(comma(dirs.i.2),14) RIGHT(comma(dirs.i.3),9) RIGHT(comma((.5+dirs.i.2/temp)%1),11) RIGHT(TRUNC(dirs.i.3/temp,2),7)
  307. END
  308. SAY
  309. SAY LEFT('',21) RIGHT('Files',5) RIGHT('Bytes',14) RIGHT('Downloads',9) RIGHT('AverageSize',11) RIGHT('DL/file',7)
  310. SAY LEFT('-',72,'-')
  311. temp=tots.1
  312. IF temp<1 THEN temp=1
  313. SAY RIGHT('TOTALS:',21) RIGHT(comma(tots.1),5) RIGHT(comma(tots.2),14) RIGHT(comma(tots.3),9) RIGHT(comma((.5+tots.2/temp)%1),11) RIGHT(TRUNC(tots.3/temp,2),7)
  314. SAY
  315. t=(.5+TIME('E'))%1
  316. min=t%60
  317. hrs=min%60
  318. min=min//60
  319. secs=t//60
  320. temp=' - It took'
  321. IF hrs>1 THEN temp=temp hrs 'hours'
  322. ELSE IF hrs=1 THEN temp=temp '1 hour'
  323. IF min>1 THEN temp=temp min 'minutes'
  324. ELSE IF min=1 THEN temp=temp '1 minute'
  325. IF secs=1 THEN temp=temp '1 second'
  326. ELSE IF secs>0 THEN temp=temp secs 'seconds'
  327. temp=temp 'to compile this report -'
  328. SAY temp
  329. SAY
  330. IF GETCLIP('BBS_level')~='' & WORD(GETCLIP('BBS_lastcaller'),1)=name THEN
  331.   CALL SETCLIP('BBS_MESSAGE','FILELISTS_REPORT is waiting in Email.')
  332. EXIT(0);
  333.  
  334.  
  335. readopen:
  336. PARSE ARG fname
  337. ok=OPEN(f,fname,'R')
  338. IF ok~=0 THEN RETURN(1)
  339. line=fname 'failed to open for reading!'
  340. SAY line
  341. RETURN(0)
  342.  
  343.  
  344. norm2seq:     /* takes '3 Jan 1990' and turns it into '19900103' */
  345. ARG da' 'mo' 'yr .
  346. da=da/1
  347. mo=STRIP(mo)
  348. yr=yr/1
  349. IF da<10 THEN da='0'da
  350. SELECT
  351.   WHEN mo='JAN' THEN mo='01'
  352.   WHEN mo='FEB' THEN mo='02'
  353.   WHEN mo='MAR' THEN mo='03'
  354.   WHEN mo='APR' THEN mo='04'
  355.   WHEN mo='MAY' THEN mo='05'
  356.   WHEN mo='JUN' THEN mo='06'
  357.   WHEN mo='JUL' THEN mo='07'
  358.   WHEN mo='AUG' THEN mo='08'
  359.   WHEN mo='SEP' THEN mo='09'
  360.   WHEN mo='OCT' THEN mo='10'
  361.   WHEN mo='NOV' THEN mo='11'
  362.   WHEN mo='DEC' THEN mo='12'
  363.   OTHERWISE RETURN(-1);
  364. END
  365. RETURN(yr||mo||da);
  366.  
  367.  
  368. comma:
  369. ARG num .
  370. num=num%1
  371. dgt=LENGTH(num)
  372. numtext=''
  373. IF dgt>3 THEN numtext=','RIGHT(num,3)
  374. IF dgt>6 THEN numtext=','LEFT(RIGHT(num,6),3)||numtext
  375. IF dgt>9 THEN
  376.   DO
  377.     numtext=','LEFT(RIGHT(num,9),3)||numtext
  378.     numtext=LEFT(num,dgt-9)||numtext
  379.   END
  380. ELSE IF dgt>6 THEN numtext=LEFT(num,dgt-6)||numtext
  381. ELSE IF dgt>3 THEN numtext=LEFT(num,dgt-3)||numtext
  382. ELSE numtext=num
  383. RETURN(numtext)
  384.  
  385.  
  386. SYNTAX:
  387. FAILURE:
  388. ERROR:
  389. SAY 'Line:' SIGL ERRORTEXT(RC)
  390. SAY
  391. EXIT;
  392.  
  393. /* end of bbsREPORT.rexx */
  394.